package bosque.unc.gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.geom.Ellipse2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.UIManager;

import java.awt.Font;

import javax.swing.JButton;

import bosque.unc.CaladoAutomatico;
import bosque.unc.CaladoCupula;
import bosque.unc.Funciones;
import bosque.unc.Telescopio;
import bosque.unc.ayuda.CaladoAyuda;
import bosque.unc.enumerations.Angulo;
import bosque.unc.enumerations.Coordenada;
import bosque.unc.enumerations.Direccion;
import bosque.unc.enumerations.Mensajes;
import bosque.unc.enumerations.Notificacion;
import bosque.unc.enumerations.Tiempo;
import bosque.unc.exceptions.CaladoException;
import bosque.unc.exceptions.CoordenadaException;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.util.HashMap;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JCheckBox;

public class CaladoAutomaticoGUI extends JFrame implements Observer
{
	private JPanel contentPane;
	private JTextField textAscHora;
	private JTextField textAscMin;
	private JTextField textAscSeg;
	
	private JTextField textDecGrados;
	private JTextField textDecMin;
	private JTextField textDecSeg;
	private Integer ascRecHoras;
	private Integer ascRecMinutos;
	private Integer ascRecSegundos;
	private Integer decliGrados;
	private Integer decliMinutos;
	private Integer decliSegundos;	
	private GraficoCaladoGUI calado;
	private static CaladoAutomatico caladoAutomatico;
	private static Scoba scoba ;
	private PosicionFinalCalado graficoTesteo;
	private CaladoAyuda caladoAyuda;
	private JPanel panelGrafico;
	private JTextField textFieldAlturaCalar;
	private JTextField textFieldAzimutCalar;	
	private JCheckBox chckbxCalarTelescopio;
	private JButton btnCalar;
	private JButton btnDetenerCalado;
	private JButton btnVerificar;	
	private Boolean verificacionOk = false;	 
	Double angHorarioVerdadero = 0.0;
	Double declinacionVerdadera = 0.0;
	Double ascencionRectaSeteada =0.0;
	private Double alturaPlataforma;
	private JLabel labelMensaje;
	private JButton btnPosicionFinalDel;
	 
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) 
	{
		EventQueue.invokeLater(new Runnable() 
		{
			public void run() 
			{
				try
				{
					System.out.println("Look and Fell: " + UIManager.getSystemLookAndFeelClassName());
					UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
				}
				catch (Exception ex)
				{
					System.out.println("Failed loading L&F: ");
					System.out.println(ex);
				}
				
				try 
				{
					CaladoAutomaticoGUI frame = new CaladoAutomaticoGUI(scoba, caladoAutomatico);
					frame.setVisible(true);
				} catch (Exception e) 
				{
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public CaladoAutomaticoGUI(Scoba sco, CaladoAutomatico caladoAut)
	{		
		inicialize(sco, caladoAut);
	}

	
	public void inicialize(Scoba sco, CaladoAutomatico caladoAut)
		{
		scoba = sco;
		caladoAutomatico = caladoAut;
		
		this.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("resources/automatico.png")));
		setTitle("Calado Automatico");		
		setBounds(100, 100, 921, 517);
		
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JPanel panelCoordenadas = new JPanel();
		panelCoordenadas.setBorder(new TitledBorder(null, "Coordenadas a calar", TitledBorder.CENTER, TitledBorder.TOP, null, null));
		panelCoordenadas.setBounds(26, 43, 358, 144);
		contentPane.add(panelCoordenadas);
		panelCoordenadas.setLayout(null);
		
		JLabel lblAscencinRecta = new JLabel("Ascenci\u00F3n Recta : ");
		lblAscencinRecta.setHorizontalAlignment(SwingConstants.RIGHT);
		lblAscencinRecta.setBounds(0, 30, 103, 14);
		panelCoordenadas.add(lblAscencinRecta);
		
		textAscHora = new JTextField();
		textAscHora.setHorizontalAlignment(SwingConstants.RIGHT);
		textAscHora.setFont(new Font("Dialog", Font.PLAIN, 14));
		textAscHora.setBounds(112, 27, 49, 20);
		textAscHora.addMouseWheelListener(new MouseWheelListener() 
		{
			public void mouseWheelMoved(MouseWheelEvent e) 
			{
				Integer notches = e.getWheelRotation();
				Integer horaAlfa = Integer.parseInt(textAscHora.getText());
				Integer val =0;
				if(horaAlfa>=0 && horaAlfa <=23)
					{
					
						val = horaAlfa - notches;
						if(val == -1)
						{
							val = 23;							
						}
						
						if(val == 24)
						{
							val = 00;							
						}						
					}				
				textAscHora.setText(val.toString());
			}
		});
		
		panelCoordenadas.add(textAscHora);
		textAscHora.setColumns(10);
		
		JLabel lblH = new JLabel("h");
		lblH.setFont(new Font("Tahoma", Font.PLAIN, 12));
		lblH.setHorizontalAlignment(SwingConstants.CENTER);
		lblH.setBounds(163, 30, 17, 14);
		panelCoordenadas.add(lblH);
		
		textAscMin = new JTextField();
		textAscMin.setHorizontalAlignment(SwingConstants.RIGHT);
		textAscMin.setFont(new Font("Dialog", Font.PLAIN, 14));
		textAscMin.setBounds(188, 27, 34, 20);
		
		
		textAscMin.addMouseWheelListener(new MouseWheelListener()
		{
			public void mouseWheelMoved(MouseWheelEvent e)
			{
				Integer notches = e.getWheelRotation();
				Integer minAlfa = Integer.parseInt(textAscMin.getText());
				Integer val =0;
				if(minAlfa>=0 && minAlfa <=59)
					{					
						val = minAlfa - notches;
						if(val == -1)
						{
							val = 59;							
						}
						
						if(val == 60)
						{
							val = 00;							
						}
						
					}
				
				textAscMin.setText(val.toString());
			}
		});
		panelCoordenadas.add(textAscMin);
		textAscMin.setColumns(10);
		
		JLabel lblM = new JLabel("m");
		lblM.setFont(new Font("Tahoma", Font.PLAIN, 12));
		lblM.setBounds(232, 29, 17, 14);
		panelCoordenadas.add(lblM);
		
		textAscSeg = new JTextField();
		textAscSeg.setHorizontalAlignment(SwingConstants.RIGHT);
		textAscSeg.setFont(new Font("Dialog", Font.PLAIN, 14));
		textAscSeg.setBounds(259, 27, 34, 20);
		textAscSeg.addMouseWheelListener(new MouseWheelListener() 
		{
			public void mouseWheelMoved(MouseWheelEvent e)
			{
				Integer notches = e.getWheelRotation();
				Integer segAlfa = Integer.parseInt(textAscSeg.getText());
				Integer val =0;
				if(segAlfa>=0 && segAlfa <=59)
					{				
						val = segAlfa - notches;
						if(val == -1)
						{
							val = 59;							
						}
						
						if(val == 60)
						{
							val = 00;							
						}						
					}				
				textAscSeg.setText(val.toString());
			}
		});
		
		panelCoordenadas.add(textAscSeg);
		textAscSeg.setColumns(10);
		
		JLabel lblS = new JLabel("s");
		lblS.setFont(new Font("Tahoma", Font.PLAIN, 12));
		lblS.setBounds(303, 29, 17, 14);
		panelCoordenadas.add(lblS);
		
		JLabel lblDeclinacin = new JLabel("Declinaci\u00F3n : ");
		lblDeclinacin.setHorizontalAlignment(SwingConstants.RIGHT);
		lblDeclinacin.setBounds(11, 71, 92, 14);
		panelCoordenadas.add(lblDeclinacin);
		
		textDecGrados = new JTextField();
		textDecGrados.setHorizontalAlignment(SwingConstants.RIGHT);
		textDecGrados.setFont(new Font("Dialog", Font.PLAIN, 14));
		textDecGrados.setColumns(10);
		textDecGrados.setBounds(112, 68, 49, 20);
		
		textDecGrados.addMouseWheelListener(new MouseWheelListener() 
		{
			public void mouseWheelMoved(MouseWheelEvent e) 
			{
				Integer notches = e.getWheelRotation();
				Integer gradDelta = Integer.parseInt(textDecGrados.getText());
				Integer val =0;
				if(gradDelta>=-90 && gradDelta <=90)
				{				
					val = gradDelta - notches;
					if(val == -90)
					{
						val = 89;						
					}
					
					if(val == 90)
					{
						val = -89;						
					}				
				}				
				textDecGrados.setText(val.toString());
			}
		});
		
		
		panelCoordenadas.add(textDecGrados);
		
		textDecMin = new JTextField();
		textDecMin.setHorizontalAlignment(SwingConstants.RIGHT);
		textDecMin.setFont(new Font("Dialog", Font.PLAIN, 14));
		textDecMin.setColumns(10);
		textDecMin.setBounds(188, 68, 34, 20);
		
		textDecMin.addMouseWheelListener(new MouseWheelListener() 
		{
			public void mouseWheelMoved(MouseWheelEvent e) 
			{
				Integer notches = e.getWheelRotation();
				Integer minDelta = Integer.parseInt(textDecMin.getText());
				Integer val =0;
				if(minDelta>=0 && minDelta <=59)
					{					
						val = minDelta - notches;
						if(val == -1)
						{
							val = 59;							
						}
						
						if(val == 60)
						{
							val = 00;							
						}						
					}				
				textDecMin.setText(val.toString());
			}
		});
		
		panelCoordenadas.add(textDecMin);
		
		textDecSeg = new JTextField();
		textDecSeg.setHorizontalAlignment(SwingConstants.RIGHT);
		textDecSeg.setFont(new Font("Dialog", Font.PLAIN, 14));
		textDecSeg.setColumns(10);
		textDecSeg.setBounds(259, 68, 34, 20);
		
		textDecSeg.addMouseWheelListener(new MouseWheelListener()
		{
			public void mouseWheelMoved(MouseWheelEvent e) 
			{
				Integer notches = e.getWheelRotation();
				Integer segDelta = Integer.parseInt(textDecSeg.getText());
				Integer val =0;
				if(segDelta>=0 && segDelta <=59)
					{					
						val = segDelta - notches;
						if(val == -1)
						{
							val = 59;							
						}
						
						if(val == 60)
						{
							val = 00;							
						}						
					}				
				textDecSeg.setText(val.toString());
			}
		});
		
		
		panelCoordenadas.add(textDecSeg);
		
		JLabel lblGrados = new JLabel("\u00B0");
		lblGrados.setFont(new Font("Tahoma", Font.PLAIN, 12));
		lblGrados.setBounds(167, 64, 17, 14);
		panelCoordenadas.add(lblGrados);
		
		JLabel lblMinutos = new JLabel("'");
		lblMinutos.setFont(new Font("Tahoma", Font.PLAIN, 12));
		lblMinutos.setBounds(232, 66, 17, 14);
		panelCoordenadas.add(lblMinutos);
		
		JLabel lblSegundos = new JLabel("''");
		lblSegundos.setFont(new Font("Tahoma", Font.PLAIN, 12));
		lblSegundos.setBounds(303, 66, 17, 14);
		panelCoordenadas.add(lblSegundos);
		
		calado = new  GraficoCaladoGUI();
		calado.setBounds(67, 69, 289, 273);
		calado.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), " Calado ", TitledBorder.CENTER, TitledBorder.TOP, null, null));
		panelGrafico = new JPanel();
		panelGrafico.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Grafico Calado Automatico", TitledBorder.CENTER, TitledBorder.TOP, null, null));
		panelGrafico.setBounds(394, 43, 431, 419);
		contentPane.add(panelGrafico);
		panelGrafico.setLayout(null);
		panelGrafico.add(calado);
		calado.setLayout(null);
		
		JLabel lblS_1 = new JLabel("S");
		lblS_1.setFont(new Font("Tahoma", Font.PLAIN, 13));
		lblS_1.setHorizontalAlignment(SwingConstants.CENTER);
		lblS_1.setBounds(195, 369, 34, 20);
		panelGrafico.add(lblS_1);
		
		JLabel lblO = new JLabel("O");
		lblO.setHorizontalAlignment(SwingConstants.CENTER);
		lblO.setFont(new Font("Tahoma", Font.PLAIN, 13));
		lblO.setBounds(10, 200, 34, 20);
		panelGrafico.add(lblO);
		
		JLabel lblE = new JLabel("E");
		lblE.setHorizontalAlignment(SwingConstants.CENTER);
		lblE.setFont(new Font("Tahoma", Font.PLAIN, 13));
		lblE.setBounds(376, 200, 34, 20);
		panelGrafico.add(lblE);
		
		JLabel lblN = new JLabel("N");
		lblN.setHorizontalAlignment(SwingConstants.CENTER);
		lblN.setFont(new Font("Tahoma", Font.PLAIN, 13));
		lblN.setBounds(195, 28, 34, 20);
		panelGrafico.add(lblN);

		alturaPlataforma = CaladoAutomaticoGUI.scoba.getPlataforma().getAltura();
		System.out.println("\nla altura de la plataforma es: "+ alturaPlataforma);		

		mostrarLecturas();

		soloNumeros(textAscHora);
		soloNumeros(textAscMin);
		soloNumeros(textAscSeg);
		soloNumeros(textDecGrados);
		soloNumeros(textDecMin);
		soloNumeros(textDecSeg);
		
		JPanel panelComandos = new JPanel();
		panelComandos.setBorder(new TitledBorder(null, "Comandos", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panelComandos.setBounds(26, 198, 358, 177);
		contentPane.add(panelComandos);
		panelComandos.setLayout(null);

		btnVerificar = new JButton("Verificar");
		btnVerificar.setBounds(40, 27, 89, 23);
		panelComandos.add(btnVerificar);
		
		JLabel lblAzimutCalar = new JLabel("Azimut calar (grad) : ");
		lblAzimutCalar.setBounds(40, 92, 106, 14);
		panelComandos.add(lblAzimutCalar);
		
		JLabel lblAlturaCalar = new JLabel("Altura calar (grad) : ");
		lblAlturaCalar.setBounds(40, 64, 106, 14);
		panelComandos.add(lblAlturaCalar);
		
		textFieldAlturaCalar = new JTextField();
		textFieldAlturaCalar.setBounds(145, 61, 49, 20);
		panelComandos.add(textFieldAlturaCalar);
		textFieldAlturaCalar.setEditable(false);
		textFieldAlturaCalar.setHorizontalAlignment(SwingConstants.CENTER);
		textFieldAlturaCalar.setColumns(10);
		
		textFieldAzimutCalar = new JTextField();
		textFieldAzimutCalar.setBounds(145, 89, 49, 20);
		panelComandos.add(textFieldAzimutCalar);
		textFieldAzimutCalar.setEditable(false);
		textFieldAzimutCalar.setHorizontalAlignment(SwingConstants.CENTER);
		textFieldAzimutCalar.setColumns(10);
		
		btnCalar = new JButton("Calar");
		btnCalar.setBounds(40, 117, 89, 23);
		panelComandos.add(btnCalar);
		
		btnDetenerCalado = new JButton("Detener Calado");
		btnDetenerCalado.setBounds(137, 117, 115, 23);
		panelComandos.add(btnDetenerCalado);
		
		btnPosicionFinalDel = new JButton("Ver Posici\u00F3n Final");
		btnPosicionFinalDel.setEnabled(false);
		btnPosicionFinalDel.setBounds(233, 27, 115, 23);
		panelComandos.add(btnPosicionFinalDel);
		
		chckbxCalarTelescopio = new JCheckBox("Calar s\u00F3lo telescopio");
		chckbxCalarTelescopio.setBounds(225, 147, 123, 23);
		panelComandos.add(chckbxCalarTelescopio);
		chckbxCalarTelescopio.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent arg0)
			{
				caladoAutomatico.setSoloTelescopio(false);
				Integer op;
				if(chckbxCalarTelescopio.isSelected())
				{
					op = JOptionPane.showConfirmDialog(btnCalar, Mensajes.WARNING_CALADO_SOLO_TEL.getMsg(), Mensajes.INFO_CALADO_SOLO_TEL.getMsg(), JOptionPane.YES_NO_OPTION);
					
					if(op == JOptionPane.YES_OPTION)
					{					
						caladoAutomatico.setSoloTelescopio(true);
						caladoAutomatico.setCaladoCupulaTerminado(true);
					}
					else
					{
						caladoAutomatico.setSoloTelescopio(false);
						chckbxCalarTelescopio.setSelected(false);
					}
				}
				else
				{
					caladoAutomatico.setSoloTelescopio(false);
				}
				
				
			}
		});
		
		labelMensaje = new JLabel("");
		labelMensaje.setHorizontalAlignment(SwingConstants.CENTER);
		labelMensaje.setFont(new Font("Tahoma", Font.BOLD, 26));
		labelMensaje.setBounds(36, 396, 338, 40);
		contentPane.add(labelMensaje);
		
		JButton btnAyuda = new JButton("?");
		btnAyuda.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e) 
			{	
				try
				{
					if(!caladoAyuda.isVisible())
						{						
						caladoAyuda.setVisible(true);
						}
					else{
						caladoAyuda.requestFocus();
						caladoAyuda.setExtendedState(JFrame.NORMAL);
						}
				}
				catch(Exception e1)
				{
					caladoAyuda = new CaladoAyuda();				
					caladoAyuda.setVisible(true);
				}		
				
			}
		});
		btnAyuda.setForeground(Color.BLUE);
		btnAyuda.setBackground(Color.BLUE);
		btnAyuda.setBounds(845, 39, 37, 23);
		contentPane.add(btnAyuda);
		
		
		btnPosicionFinalDel.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent arg0) 
			{
				try
				{
					if(!graficoTesteo.isVisible())
						{								
						graficoTesteo.setVisible(true);						
						}
					else{
						graficoTesteo.requestFocus();
						graficoTesteo.setExtendedState(JFrame.NORMAL);
						}
				}
				catch(Exception e1)
				{
					graficoTesteo = new PosicionFinalCalado(scoba);				
					graficoTesteo.setVisible(true);
				}
			
				
				double altura = scoba.getCaladoAutomatico().getAlturaTelACalar();
				double azimut = scoba.getCaladoAutomatico().getAzimutTelACalar();
				graficoTesteo.getGraficoGuiCaladoAuto().dibujarTelescopio(altura,azimut);
				
				Integer azimutTel = (int) Math.toDegrees(scoba.getCaladoAutomatico().getAzimutTelACalar());
				graficoTesteo.getGraficoGuiCaladoAuto().dibujarCupula(azimutTel);
			}
		});
		btnDetenerCalado.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e)
			{
	
				caladoAutomatico.getColaMovimientos().clear();
				caladoAutomatico.setCalando(false);
			    caladoAutomatico.setCalandoTelescopio(false);
			    caladoAutomatico.setCalandoCupula(false);
			    caladoAutomatico.setCalandoPlataforma(false);
			    caladoAutomatico.detenerCalado();
			    btnCalar.setEnabled(false);
			    btnVerificar.setEnabled(true);
			    scoba.getManoplaGUI().activarControles(true);
								
			}
		});

		btnCalar.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent arg0) 
			{
				Integer opcion;
				opcion = JOptionPane.showConfirmDialog(btnCalar, Mensajes.QUESTION_CALADO_COMENZAR.getMsg(), Mensajes.INFO_CALADO_COMENZAR.getMsg(), JOptionPane.YES_NO_OPTION);
				
				if(opcion == JOptionPane.YES_OPTION)
				{					
					Thread hiloCaladoAutomatico = new Thread(caladoAutomatico);
					hiloCaladoAutomatico.start();
					btnDetenerCalado.setEnabled(true);
					btnCalar.setEnabled(false);
					btnVerificar.setEnabled(false);			
				}
				else
				{
				} 
			}
		});
		btnVerificar.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e) 
			{				
				if(verificacionOk)
				{
					habilitarTextFields(true);
					btnVerificar.setText("Verificar");
					btnCalar.setEnabled(false);
					setVerificacionOk(false);
					btnPosicionFinalDel.setEnabled(false);
				}
						
				else
				{											
					// Llamar rutina de verificacion y setear flag de verificado 
					boolean verif = rutinaDeVerificacion();
					setVerificacionOk( verif );

					if(getVerificacionOk())
					{
						habilitarTextFields(false);
						btnVerificar.setText("Cancelar");
						btnCalar.setEnabled(true);
						btnPosicionFinalDel.setEnabled(true);
					}				
				}						
			}
		});
		
		
	}

	/**Metodo que calcula la altura y azimut con la dec y la ascRecta
	 * 
	 * @param dec
	 * @param ascRecta
	 */
	public void verificarCoord(Integer dec, Integer ascRecta) 
	{
		HashMap<Coordenada,Double> coor = Funciones.getAlturaAzimutFromDecAngHor(declinacionVerdadera, angHorarioVerdadero);
        Double altura = coor.get(Coordenada.ALTURA); // altura en grados ???? ... esto esta en radianes !!
        Double azimut = coor.get(Coordenada.AZIMUT);
		
	}

	/**
	 * Permite ingresar solo numeros en los textField
	 * @param a
	 */
	public void soloNumeros(JTextField a){
		
		a.addKeyListener(new KeyAdapter(){
		
			public void keyTyped(KeyEvent e) {
				
				char c = e.getKeyChar();
				if(Character.isLetter(c)){
					
					getToolkit().beep();
					e.consume(); // que no te permita ingresar letras
				}
			}
			
		});
	}

	/*Setters y Guetters*/
	
	public Integer getAscRecHoras() 
	{
		return ascRecHoras;
	}

	public void setAscRecHoras(Integer ascRecHoras) 
	{
		this.ascRecHoras = ascRecHoras;
	}

	public Integer getAscRecMinutos() 
	{
		return ascRecMinutos;
	}

	public void setAscRecMinutos(Integer ascRecMinutos) 
	{
		this.ascRecMinutos = ascRecMinutos;
	}

	public Integer getAscRecSegundos() 
	{
		return ascRecSegundos;
	}

	public void setAscRecSegundos(Integer ascRecSegundos) 
	{
		this.ascRecSegundos = ascRecSegundos;
	}

	public Integer getDecliGrados() 
	{
		return decliGrados;
	}

	public void setDecliGrados(Integer decliGrados) 
	{
		this.decliGrados = decliGrados;
	}

	public Integer getDecliMinutos() 
	{
		return decliMinutos;
	}

	public void setDecliMinutos(Integer decliMinutos) 
	{
		this.decliMinutos = decliMinutos;
	}

	public Integer getDecliSegundos() 
	{
		return decliSegundos;
	}

	public void setDecliSegundos(Integer decliSegundos) 
	{
		this.decliSegundos = decliSegundos;
	}
	public JTextField getTextHora() 
	{
		return textAscHora;
	}

	public void setTextHora(JTextField textHora) 
	{
		this.textAscHora = textHora;
	}

	public JTextField getTextMin() 
	{
		return textAscMin;
	}

	public void setTextMin(JTextField textMin) 
	{
		this.textAscMin = textMin;
	}

	public JTextField getTextSeg() 
	{
		return textAscSeg;
	}

	public void setTextSeg(JTextField textSeg) 
	{
		this.textAscSeg = textSeg;
	}

	public JTextField getTextGrados()
	{
		return textDecGrados;
	}

	public void setTextGrados(JTextField textGrados) 
	{
		this.textDecGrados = textGrados;
	}

	public JTextField getTextMinutos() 
	{
		return textDecMin;
	}

	public void setTextMinutos(JTextField textMinutos)
	{
		this.textDecMin = textMinutos;
	}

	public JTextField getTextSegundos() 
	{
		return textDecSeg;
	}

	public void setTextSegundos(JTextField textSegundos)
	{
		this.textDecSeg = textSegundos;
	}
	
	public JButton getBtnCalar() 
	{
		return btnCalar;
	}
	
	/**
	 * Metodo que habilita los textfield
	 * @param estado
	 */
	public void habilitarTextFields(boolean estado)
	{
		this.textAscHora.setEnabled(estado);
		this.textAscMin.setEnabled(estado);
		this.textAscSeg.setEnabled(estado);
		this.textDecGrados.setEnabled(estado);
		this.textDecMin.setEnabled(estado);
		this.textDecSeg.setEnabled(estado);
	}

	
	/**
	 * Verifica que el operador ingreso un valor en los textField de las coordenadas a calar (declinacion y ascencion recta)
	 * @return true si se ha ingresado numeros en los TextField
	 * @throws CoordenadaException
	 */
	private boolean verificarDatosIngresados() throws CoordenadaException
	{		
		if(textAscHora.getText().trim().length() == 0)
		{
			throw new CoordenadaException(Mensajes.INVALID_TEXTFIELD_ASCR_HS_VACIO); 
		}			
		
		else if(textAscMin.getText().trim().length()==0)
		{
			throw new CoordenadaException(Mensajes.INVALID_TEXTFIELD_ASCR_MIN_VACIO); 
		}	
		else if (textAscSeg.getText().trim().length()==0)
		{
			throw new CoordenadaException(Mensajes.INVALID_TEXTFIELD_ASCR_SEG_VACIO); 
		}
		else if(textDecGrados.getText().trim().length()==0)
		{
			throw new CoordenadaException(Mensajes.INVALID_TEXTFIELD_DEC_GRAD_VACIO);  
		}	
		else if(textDecMin.getText().trim().length()==0)
		{
			throw new CoordenadaException(Mensajes.INVALID_TEXTFIELD_DEC_MIN_VACIO); 
		}	
		else if(textDecSeg.getText().trim().length()==0)
		{
			throw new CoordenadaException(Mensajes.INVALID_TEXTFIELD_DEC_SEG_VACIO); 
		}	
		
		return true;
	}

	private Boolean getVerificacionOk() 
	{
		return verificacionOk;
	}

	private void setVerificacionOk(Boolean verificacionOk) 
	{
		this.verificacionOk = verificacionOk;
	}

	
	/**
	 * Muestra la altura y azimut en grados en los TextField para realizar el calado
	 */
	private void mostrarAlturaYAzimutACalar()
	{
		textFieldAlturaCalar.setText(String.format("%.2f",Math.toDegrees(caladoAutomatico.getAlturaTelACalar())));
	    textFieldAzimutCalar.setText(String.format("%.2f",Math.toDegrees(caladoAutomatico.getAzimutTelACalar())));
	}
	
	/**
	 * parsea las coordenadas ingresadas por el operador
	 * @throws CoordenadaException
	 */
	private void parsearCoordenadas() throws CoordenadaException
	{
		try {
			ascRecHoras = Integer.parseInt(scoba.getCaladoAutomaticoGUI().getTextHora().getText()); // alfa
			ascRecMinutos = Integer.parseInt(scoba.getCaladoAutomaticoGUI().getTextMin().getText());
			ascRecSegundos = Integer.parseInt(scoba.getCaladoAutomaticoGUI().getTextSeg().getText());
			decliGrados = Integer.parseInt(scoba.getCaladoAutomaticoGUI().getTextGrados().getText());// delta
			decliMinutos = Integer.parseInt(scoba.getCaladoAutomaticoGUI().getTextMinutos().getText());
			decliSegundos = Integer.parseInt(scoba.getCaladoAutomaticoGUI().getTextSegundos().getText());
		} catch (NumberFormatException e) {
			throw new CoordenadaException(Mensajes.INVALID_COORD_TIPO_DATO);
		}
	}
	
	
	/**
	 * verifica que todo este correcto antes de hacer el calado
	 * @return true si se puede realizar el calado
	 */
	private boolean rutinaDeVerificacion()
	{
		boolean verificado = false;
		caladoAutomatico.setCaladoCupulaTerminado(false);
		try {
			
			verificarDatosIngresados();
			parsearCoordenadas();
			
			HashMap<Angulo, Integer> dec = new HashMap<Angulo,Integer>();
			HashMap<Tiempo, Integer> ascR = new HashMap<Tiempo,Integer>();

			dec.put(Angulo.GRADOS, decliGrados);
			dec.put(Angulo.MINUTOS, decliMinutos);
			dec.put(Angulo.SEGUNDOS, decliSegundos);
			ascR.put(Tiempo.HORAS, ascRecHoras);
			ascR.put(Tiempo.MINUTOS, ascRecMinutos);
			ascR.put(Tiempo.SEGUNDOS, ascRecSegundos);
						
			caladoAutomatico.setearCoordenadasACalar(dec, ascR);
			caladoAutomatico.verificarCoordenadasACalar();
			caladoAutomatico.calcularAlturaAzimutACalar();
			mostrarAlturaYAzimutACalar();
			caladoAutomatico.verificarAlturaTelescopio();
			if(!caladoAutomatico.getSoloTelescopio()) // si se selecciona calar solo telescopio entonces no calar la plataforma
			{
				caladoAutomatico.verificarAlturaPlataforma();
			}
			else
			{
				caladoAutomatico.setCaladoPlataformaTerminado(true);
			}
											
			verificado = true;
			
			caladoAutomatico.calcularSecuenciaDeMovimientos();
			
			calado.dibujarTrayectoriaSecuencia(caladoAutomatico.getSecuenciaMov());
			calado.setFlagMostrarTrayectoria(true);
			calado.repaint();
			
		// El try puede tirar 2 tipos de excepciones (de coordenadas y de calado)	
		} catch (CoordenadaException | CaladoException ex) {						

			
			if(ex instanceof CoordenadaException)
			{
				JOptionPane.showMessageDialog(btnVerificar, ((CoordenadaException) ex).getErrorMsg()); 
			}
			
			if(ex instanceof CaladoException)							
			{
				
				{
					System.out.println(((CaladoException) ex).getError());
					if( ((CaladoException) ex).getError() == Mensajes.ERROR_CALADO_ALTURA_PLAT)
					{
						Integer opcion;
						opcion = JOptionPane.showConfirmDialog(btnVerificar,((CaladoException) ex).getErrorMsg() + 
								"\n" + Mensajes.QUESTION_CALADO_PLAT_MOVER.getMsg(), 
								Mensajes.INFO_CALADO_PLAT_ALTURA.getMsg() , JOptionPane.YES_NO_OPTION);
						
						if(opcion == JOptionPane.YES_OPTION)
						{
							getCaladoAutomatico().calarPlataforma();
						}
						else
						{
							// MOSTRAR LA MANOPLA PARA MOVER MANUALMENTE LA PLATAFORMA
							scoba.getManoplaGUI().setVisible(true);
						}
						
					}
					else
					{
						JOptionPane.showMessageDialog(btnVerificar, ((CaladoException) ex).getErrorMsg()); 
					}
				}				
			}
			
			setVerificacionOk(false);			 
		}		
		return verificado;
	}

	public PosicionFinalCalado getGraficoTesteo()
	{
		return graficoTesteo;
	}

	public void setGraficoTesteo(PosicionFinalCalado graficoTesteo) 
	{
		this.graficoTesteo = graficoTesteo;
	}

	public JTextField getTextFieldAlturaCalar()
	{
		return textFieldAlturaCalar;
	}

	public void setTextFieldAlturaCalar(JTextField textFieldAlturaCalar)
	{
		this.textFieldAlturaCalar = textFieldAlturaCalar;
	}

	public JTextField getTextFieldAzimutCalar()
	{
		return textFieldAzimutCalar;
	}

	public void setTextFieldAzimutCalar(JTextField textFieldAzimutCalar) 
	{
		this.textFieldAzimutCalar = textFieldAzimutCalar;
	}

	public static CaladoAutomatico getCaladoAutomatico() 
	{
		return caladoAutomatico;
	}

	public static void setCaladoAutomatico(CaladoAutomatico caladoAutomatico) 
	{
		CaladoAutomaticoGUI.caladoAutomatico = caladoAutomatico;
	}

	@Override
	public void update(Observable objectObs, Object argument) 
	{
		switch((Notificacion)argument)
		{
		case TEL_COLISION:
			JOptionPane.showMessageDialog(this, Mensajes.WARNING_CALADO_COLISION.getMsg());
			break;
		case PLAT_FIN_CALADO:
			JOptionPane.showMessageDialog(this, Mensajes.INFO_CALADO_PLAT_FIN_CALADO.getMsg()); 
			labelMensaje.setText("");
			break;
		case CUPULA_FIN_CALADO:
			labelMensaje.setText("");
			break;
		case PLAT_CALANDO:
			labelMensaje.setText(Mensajes.INFO_CALADO_CALANDO_PLAT.getMsg());
			scoba.getManoplaGUI().activarControles(false);
			break;
		case CUPULA_CALANDO:
			labelMensaje.setText(Mensajes.INFO_CALADO_CALANDO_CUP.getMsg());
			scoba.getManoplaGUI().activarControles(false);
			break;
		case TEL_CALANDO:
			labelMensaje.setText(Mensajes.INFO_CALADO_CALANDO_TEL.getMsg());
			scoba.getManoplaGUI().activarControles(false);
			break;
		case CALADO_AUTO_FIN:
			labelMensaje.setText(Mensajes.INFO_CALADO_AUTO_FIN.getMsg());
		    btnCalar.setEnabled(false);
		    btnVerificar.setEnabled(true);
		    scoba.getManoplaGUI().activarControles(true);
		    
			break;
			
		default:
			break;
		}
	}

	public GraficoCaladoGUI getCalado() {
		return calado;
	}

	/**
	 *Metodo para mostrar las luectas de ascencion recta en el textfield 
	 */
	public void mostrarLecturas(){
		Integer ascRecHor = Funciones.horasToHsMinSegHashMap(Funciones.gradosSexToHoras( Math.toDegrees

				(Funciones.getAscencionRectaFromAngHorario(Math.toDegrees(scoba.getTelescopio().getAngHorarioRad()))))).get(Tiempo.HORAS);

		Integer ascRecMi   = Funciones.horasToHsMinSegHashMap(Funciones.gradosSexToHoras( Math.toDegrees

				(Funciones.getAscencionRectaFromAngHorario(Math.toDegrees(scoba.getTelescopio().getAngHorarioRad()))))).get(Tiempo.MINUTOS);

		Integer ascRecSe   = Funciones.horasToHsMinSegHashMap(Funciones.gradosSexToHoras( Math.toDegrees

				(Funciones.getAscencionRectaFromAngHorario(Math.toDegrees(scoba.getTelescopio().getAngHorarioRad()))))).get(Tiempo.SEGUNDOS);

		textDecGrados.setText("-31");
		textDecMin.setText("00");
		textDecSeg.setText("00");		


		textAscHora.setText(ascRecHor.toString());
		textAscMin.setText(ascRecMi.toString());
		textAscSeg.setText(ascRecSe.toString());
	}

	
	public JLabel getLabelMensaje() 
	{
		return labelMensaje;
	}
	public JButton getBtnPosicionFinalDel()
	{
		return btnPosicionFinalDel;
	}
	public JButton getBtnDetenerCalado() 
	{
		return btnDetenerCalado;
	}

	public JButton getBtnVerificar()
	{
		return btnVerificar;
	}

	public void setBtnVerificar(JButton btnVerificar) 
	{
		this.btnVerificar = btnVerificar;
	}

	public void setBtnCalar(JButton btnCalar) 
	{
		this.btnCalar = btnCalar;
	}

	public void setBtnDetenerCalado(JButton btnDetenerCalado)
	{
		this.btnDetenerCalado = btnDetenerCalado;
	}

	public void setBtnPosicionFinalDel(JButton btnPosicionFinalDel) 
	{
		this.btnPosicionFinalDel = btnPosicionFinalDel;
	}
}
